<?php

/**
 * @file
 * Contains \Drupal\entity_test\Controller\EntityTestController.
 */

namespace Drupal\entity_test\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Entity\Query\QueryFactory;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Controller routines for entity_test routes.
 */
class EntityTestController extends ControllerBase {

  /**
   * The entity query factory.
   *
   * @var \Drupal\Core\Entity\Query\QueryFactory
   */
  protected $entityQueryFactory;

  /**
   * Constructs a new EntityTestController.
   *
   * @param \Drupal\Core\Entity\Query\QueryFactory
   *   The entity query factory.
   */
  public function __construct(QueryFactory $entity_query_factory) {
    $this->entityQueryFactory = $entity_query_factory;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity.query')
    );
  }

  /**
   * Displays the 'Add new entity_test' form.
   *
   * @param string $entity_type
   *   Name of the entity type for which a create form should be displayed.
   *
   * @return array
   *   The processed form for a new entity_test.
   *
   * @see \Drupal\entity_test\Routing\EntityTestRoutes::routes()
   */
  public function testAdd($entity_type) {
    $entity = entity_create($entity_type, array());
    $form = $this->entityFormBuilder()->getForm($entity);
    $form['#title'] = $this->t('Create an @type', array('@type' => $entity_type));
    return $form;
  }

  /**
   * Displays the 'Edit existing entity_test' form.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The request object to get entity type from.
   *
   * @return array
   *   The processed form for the edited entity.
   *
   * @see \Drupal\entity_test\Routing\EntityTestRoutes::routes()
   */
  public function testEdit(Request $request) {
    $entity = $request->attributes->get($request->attributes->get('_entity_type'));
    $form = $this->entityFormBuilder()->getForm($entity);
    $form['#title'] = $entity->label();
    return $form;
  }

  /**
   * Returns an empty page.
   *
   * @see \Drupal\entity_test\Routing\EntityTestRoutes::routes()
   */
  public function testAdmin() {
    return '';
  }

  /**
   * List entity_test entities referencing the given entity.
   *
   * @param string $entity_reference_field_name
   *   The name of the entity_reference field to use in the query.
   * @param string $referenced_entity_type
   *   The type of the entity being referenced.
   * @param int $referenced_entity_id
   *   The ID of the entity being referenced.
   *
   * @return array
   *   A renderable array.
   */
  public function listReferencingEntities($entity_reference_field_name, $referenced_entity_type, $referenced_entity_id) {
    // Early return if the referenced entity does not exist (or is deleted).
    $referenced_entity = $this->entityManager()
      ->getStorage($referenced_entity_type)
      ->load($referenced_entity_id);
    if ($referenced_entity === NULL) {
      return array();
    }

    $query = $this->entityQueryFactory
      ->get('entity_test')
      ->condition($entity_reference_field_name . '.target_id', $referenced_entity_id);
    $entities = $this->entityManager()
      ->getStorage('entity_test')
      ->loadMultiple($query->execute());
    return $this->entityManager()
      ->getViewBuilder('entity_test')
      ->viewMultiple($entities, 'full');
  }

}
